參考讀物: 官方
class DialogModal(discord.ui.Modal):
def __init__(self, *, timeout=180):
super().__init__(timeout=timeout)
self.add_item(discord.ui.InputText(label="標題"))
self.add_item(discord.ui.InputText(label="內容", style=discord.InputTextStyle.long))
async def callback(self, interaction: discord.Interaction):
embed = discord.Embed(title=self.children[0].value)
embed.add_field(name="內容", value=self.children[1].value)
await interaction.response.send_message(embeds=[embed])
@Bot.slash_command(name="選單")
async def click_click(ctx: discord.ApplicationContext):
await ctx.send_modal(DialogModal(title="敲敲話"))
結果:
此篇使用 discord.ext.commands.Bot.slash_command 註冊了 command
並在回傳時,原本
await ctx.send("回傳的文字")
變成了...
await ctx.send_modal(DialogModal(title="敲敲話"))
並且,discord.ui.Modal
使用 class 宣告內容
參數 | 內容 |
---|---|
children | 顯示在模式對話框中的InputText |
title | 對話框的標題。 |
custom_id | 對話框的ID。 |
timeout | 超時時間 |
@discord.InputText
參數 | 內容 |
---|---|
style | 文本樣式 |
custom_id | 文本字段的 ID |
label | 文本標籤 |
placeholder | 未選擇任何內容時顯示的文本 |
min_length | 符號 |
max_length | 符號 |
required | 是否為必填 |
value | 預設內容 |
row | 所屬相對行數,DC組件最多五行 |
而 callback 回傳 interaction
在 @Bot.command 是無法直接觸發 send_modal()
因為 callback 而非 slash_command、user_command、message_command 一樣 callback為 interation
而是,ctx: commands.Context
所以無法直接嵌入Modal
但官方是能用command去觸發 前幾篇介紹的UI(Button、Select)後,得到的callback就會是interaction
@Bot.command(name="敲敲話")
async def click_click(ctx: commands.Context):
class MyView(discord.ui.View):
@discord.ui.button(label="想要敲敲話", style=discord.ButtonStyle.primary)
async def button_callback(self, button: discord.ui.Button, interaction: discord.Interaction):
await interaction.response.send_modal(DialogModal(title="敲敲話"))
await ctx.send(view=MyView())